Шаг 241 - Чернопятов Е.А. Автоматизация приложений MS Office. Часть 2.

Добрый день, Артём. 
Посылаю Вам исправленный 241й шаг (2я часть статьи про автоматизацию оффиса), а также 3ю часть статьи 
(наверное, заключительную, написанную "по просьбам телезрителей") и исходники, 
иллюстрирующие всё в статье изложенное.
С уважанием,  Чернопятов Е.А.
http://ercombinati.narod.ru/articles

Продолжение описания начатого в Шаг 240 - АВТОМАТИЗАЦИЯ приложений MS Office.

Подравняем?

Мы научились выводить текст на страницу. Это неплохо, но для полного счастья не хватает, чтобы этот текст был форматированным. Этим мы сейчас и займемся. Определим константы, необходимые для задания типов выравнивания, и вставки разрыва (соответственно, разрыва страницы и секции).

typedef enum {
        wdAlignParagraphLeft = 0,
        wdAlignParagraphCenter = 1,
        wdAlignParagraphRight = 2,
        wdAlignParagraphJustify = 3,
        wdAlignParagraphDistribute = 4,
        wdAlignParagraphJustifyMed = 5,
        wdAlignParagraphJustifyHi = 7,
        wdAlignParagraphJustifyLow = 8
    } WdParagraphAlignment;

Для изменения выравнивания текста у текущего выделения есть метод void SetAlignment(long nNewValue), в качестве параметра которому передается требуемое выравнивание.

Обратите внимание, что при задании строчек вывода мы по-прежнему можем пользоваться символами табуляции и перевода строки.

В продолжение предыдущего шага пишем:

oPar.SetAlignment(wdAlignParagraphCenter);	
oSel.TypeText("Этот текст будет выровнен по центру\n");
oPar.SetAlignment(wdAlignParagraphRight );	
oSel.TypeText("Этот текст будет выровнен по правому краю\n");
oPar.SetAlignment(wdAlignParagraphLeft );	
oSel.TypeText("Этот текст будет выровнен по левому краю\n");
oPar.SetAlignment(wdAlignParagraphJustify );	
oSel.TypeText("Этот текст будет выровнен по обоим краям\n");

Теперь поменяем начертание шрифта. Для этого можно использовать методы BoldRun() и ItalicRun(), принадлежащие Selection :

oSel.BoldRun();	
oSel.TypeText("Этот текст будет жирным\n");
oSel.ItalicRun();
oSel.TypeText("Этот текст будет наклонным\n");

Для того, чтобы отключить изменение начертания, достаточно просто вызвать соответствующий метод еще раз (совсем как когда мы нажимаем/отжимаем кнопки 241_1.gif (153 b) и 241_2.gif (143 b)).

Вставим в документ разрыв страницы. Это будет немного сложнее, поскольку метод InsertBreak требует в качестве параметра переменную типа COleVariant. Но мы можем воспользоваться простым конструктором с параметром для преобразования наших констант в требуемый тип:

typedef enum {
    wdSectionBreakNextPage = 2,
    wdSectionBreakContinuous = 3,
    wdSectionBreakEvenPage = 4,
    wdSectionBreakOddPage = 5,
    wdLineBreak = 6,
    wdPageBreak = 7,
    wdColumnBreak = 8,
    wdLineBreakClearLeft = 9,
    wdLineBreakClearRight = 10,
    wdTextWrappingBreak = 11
} WdBreakType;

COleVariant сovBreakType((long)wdPageBreak); 
// вставить разрыв страницы
oSel.InsertBreak(covBreakType);

На самом деле, более предпочтительным методом изменения начертания текста является непосредственное обращение к шрифту текущего выделения. К тому же, в этом случае кроме начертания мы можем менять и прочие параметры шрифта, такие, как семейство, размер и проч.

_Font fnt; 
// получить параметры шрифта выделения
fnt=oSel.GetFont(); 
// сделать шрифт полужирным
fnt.SetBold(1);                      
// изменить имя шрифта
fnt.SetName("Arial");
// изменить размер шрифта 
fnt.SetSize(24);
oSel.TypeText("Этот текст будет полужирным семейства Arial, размером 24.");

Отмечу, что для снятия атрибутов шрифта достаточно вызвать соответствующий метод с параметром 0, например:

// снять атрибут полужирности
fnt.SetBold(0);

Добавляем красоты

В настоящее время редкий документ обходится без картинок. Не будем и мы лишать себя удовольствия немного разнообразить скучный текст.

Для начала добавим две переменных типа COleVariant с начальными значениями TRUE и FALSE.

COleVariant
	covTrue((short)TRUE),
	covFalse((short)FALSE);

Теперь точно также, как раньше, добавляем 2 класса, которые отвечают за "внедренные фигуры". Первый класс, как обычно, коллекция, второй - одиночная фигура.

InlineShapes oShps;
InlineShape oShp;

Получаем текущюю коллекцию, и добавляем в нее новую фигуру. Для этого используем метод LPDISPATCH AddPicture(LPCTSTR FileName, VARIANT* LinkToFile, VARIANT* SaveWithDocument, VARIANT* Range);. Обратите внимание на параметры. Первый - это местоположение вставляемой картинки на диске, второй - вставлять картинку в текст как она есть на момент вставки или установить связь с картинкой таким образом, чтобы при изменении изображения оно обновлялось и в документе. Третий параметр - сохранять ли картинку внутри документа. Последний параметр мы игнорируем. Эти параметры похожи на те, которые мы настраиваем в Word-e:

//добавим параграф
oSel.TypeParagraph();	
oShps = oSel.GetInlineShapes();
oShp = oShps.AddPicture("d:\\winnt\\Rhododendron.bmp",covFalse,covTrue,covOptional);

Естественно, на Вашей машине путь к картинке будет другим :)

Мы можем изменять параметры нашей картинки, например, ее ширину и высоту. Например, увеличим размер вставленной картинки в 1.5 раза.

float width = oShp.GetWidth();
float height = oShp.GetHeight();
oShp.SetWidth(width*1.5);
oShp.SetHeight(height*1.5);

Сохранение

Если попытаться закрыть наш красивый документ, то выяснится, что имя-то мы ему не задали, и автоматически не сохранили. Пользователю приходится самому придумывать, куда записывать и какое имя давать отчету. Давайте избавим пользователя от лишних вопросов. Для этого у нас есть функция... правильно, void SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments, VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword, VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat, VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter);, опять-таки со множеством параметров. Можно настроить все, что угодно, включая пароль.

_Document oActiveDoc; 
oActiveDoc = app.GetActiveDocument();
oActiveDoc.SaveAs(COleVariant("c:\\doc1.doc"), 
COleVariant((short)0),
covFalse, COleVariant(""), covTrue, COleVariant(""),
covFalse, covFalse, covFalse, covFalse, covFalse);
Hosted by uCoz